package com.dailyblue.java.spring.aop.annotation.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

// 公共部分
@Aspect
@EnableAspectJAutoProxy  // 自动装配
@Component
public class UserDAOAdvice {
    // 类似于变量的定义方式，给切面起了一个名字
    @Pointcut("execution(* com.dailyblue.java.spring.aop.annotation.target.*.*(..))")
    private void execute() {
    }

    // 前置通知 ，定义切入点
    @Before("execution(* com.dailyblue.java.spring.aop.annotation.target.UserDAO.find*(..))")
    public void before() {
        System.out.println("我会在目标对象执行之前执行....");
    }

    // 后置通知
    @AfterReturning("execution(* com.dailyblue.java.spring.aop.annotation.target.*.*(..))")
    public void after() {
        System.out.println("只要是target的对象的任意方法我都会在之后触发");
    }

    @After("execute()")
    public void zuizhong() {
        System.out.println("我会在最后执行");
    }

    @Around("execute()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("环绕之前.....");
        Object result = pjp.proceed(); // 目标对象的方法执行
        System.out.println("环绕之后.....");
        return result;
    }
    @AfterThrowing("execute()")
    public void exception(){
        System.out.println("你的代码出现了错误");
    }
}
